﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// NotReviewedButNeeded

#pragma once

#include "GcmpDevService.h"

#pragma warning( push )
#pragma warning( disable : 4251 )

namespace gcmp
{
    /// \brief 方便开发人员弹出可见的对话框，以传递程序运行过程中可能的问题,
    ///
    ///  TODO: 自定义对话框界面，支持“忽略所有”的选项
    class GCMP_DEV_SERVICE_EXPORT DebugMessageMgr
    {
    private:
        DebugMessageMgr(void);

    public:
        ~DebugMessageMgr(void);

    // Singleton界面
    public:
        static const DebugMessageMgr* GetDebugMessageMgr();
        static DebugMessageMgr* GetDebugMessageMgrFW();

    // 弹出调试信息对话框，一般不直接使用，请使下面定义的宏，如DBG_WARN，DBG_WARN_UNLESS等。
    public:
        /// \brief 显示调试警告
        ///
        /// \param fileName      文件名
        /// \param lineNumber    行号
        /// \param functionName  函数名
        /// \param text          警告文本
        /// \param name          姓名
        /// \param date          日期
        /// \return 
        void ShowDebugWarn(const std::string& fileName, int lineNumber, const std::string& functionName, const std::wstring& text, const std::wstring& name, const std::wstring& date) const;
        
        /// \brief 注册为listener后在显示DebugWarnDialog前后有机会运行
        ///
        /// \param listener  回调函数
        /// \return 
        void RegisterAsPreShowListener(std::function<void()> listener);

        /// \brief  注册为listener后在显示DebugWarnDialog前后有机会运行
        ///
        /// \param listener  回调函数
        /// \return 
        void RegisterAsPostShowListener(std::function<void()> listener);

        /// \brief 标记即将退出Application，无需再ShowDebugWarn
        ///
        /// \param bWillQuitApplication  是否退出应用程序
        /// \return 
        void SetWillQuitApplication(bool bWillQuitApplication);

        /// \brief 是否已经有Debug Warn正在显示
        ///
        /// \return true: 是； false: 否
        bool IsShowingDebugWarn() const;

    public:
        /// \brief 调试输出
        ///
        /// \return
        void Dump() const;
    };
}

#define DBG_WARN(text, name, date) \
    gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date);

#define DBG_WARN_UNLESS(condition, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
    }

#define DBG_WARN_AND_RETURN_UNLESS(condition, returnValue, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
        return (returnValue); \
    }

#define DBG_WARN_AND_RETURN_VOID_UNLESS(condition, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
        return; \
    }

#define DBG_WARN_AND_RETURN_NULLPTR_UNLESS(condition, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
        return nullptr; \
    }

#define DBG_WARN_AND_RETURN_FALSE_UNLESS(condition, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
        return false; \
    }

#define DBG_WARN_AND_CONTINUE_UNLESS(condition, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
        continue; \
    }

#define DBG_WARN_AND_BREAK_UNLESS(condition, text, name, date) \
    if(!(condition)) \
    { \
        gcmp::DebugMessageMgr::GetDebugMessageMgr()->ShowDebugWarn(__FILE__, __LINE__, __FUNCTION__, text, name, date); \
        break; \
    }

#pragma warning( pop )
